package org.soderiakelvy.controller.sujeto;

import java.io.Serializable;



import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.FlowEvent;
import org.soderiakelvy.controller.util.Constante;
import org.soderiakelvy.controller.util.SelectOneMany;
import org.soderiakelvy.model.domain.ComercializacionPackVO;
import org.soderiakelvy.model.domain.DesProdTipoCliVO;
import org.soderiakelvy.model.domain.PackVO;
import org.soderiakelvy.model.domain.ProductoVO;
import org.soderiakelvy.model.domain.RepartoVO;
import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.domain.SujetoVO;
import org.soderiakelvy.model.domain.TipoClienteVO;
import org.soderiakelvy.model.domain.VisitaVO;
import org.soderiakelvy.model.service.ProductoServicio;
import org.soderiakelvy.model.service.RepartoServicio;
import org.soderiakelvy.model.service.SucursalServicio;
import org.soderiakelvy.model.service.SujetoServicio;
import org.soderiakelvy.model.service.imp.ProductoServicioImp;
import org.soderiakelvy.model.service.imp.RepartoServicioImp;
import org.soderiakelvy.model.service.imp.SucursalServicioImp;
import org.soderiakelvy.model.service.imp.SujetoServicioImpl;
import org.soderiakelvy.model.util.ConstantModel;


@ManagedBean
@ViewScoped
public class SujetoResidencialCreate implements Serializable{
	private static final long serialVersionUID = 3436636001270409892L;
	// --- SERVICE ---
	private SujetoServicio serviceSujeto = new SujetoServicioImpl();
	private SucursalServicio serviceSucursal = new SucursalServicioImp();
	private RepartoServicio serviceReparto = new RepartoServicioImp();
	//--- VO ---
	private TipoClienteVO tipoCliente;	
	private SujetoVO sujeto;
	private SucursalVO sucursal;
	private VisitaVO visita;
	private RepartoVO reparto;
	private ComercializacionPackVO comercializacionPack;
	private PackVO pack;
	
	//--- List ---
	private List<DesProdTipoCliVO> productosDisponibles;
	private List<ProductoVO> productoAsignados = new ArrayList<ProductoVO>();
	private DesProdTipoCliVO[] productosSeleccionados;
	private List<PackVO> packDisponibles = new ArrayList<PackVO>();
	private String[] diasSeleccionados;
	
	// --- CONSTRUCTOR ---
	public SujetoResidencialCreate(){
		tipoCliente				= serviceSujeto.getDefaultValue();
		sucursal 				= new SucursalVO();
		sujeto 					= new SujetoVO();
		visita 					= new VisitaVO();
		reparto					= new RepartoVO();
		comercializacionPack	= new ComercializacionPackVO();
		pack					= new PackVO();
		
	}
	
	// -------------------
	
	public String onFlowProcess(FlowEvent event) {
		if(event.getNewStep().equals("producto")){
			System.out.println("tipo de cliente: "+ tipoCliente.getTipoClienteId());
			productosDisponibles = serviceSujeto.getProductosConDescuentoByTipoCliente(tipoCliente);
		}
		//--- Logica de Negocio ---
		if(event.getNewStep().equals("pack")){
			packDisponibles = SelectOneMany.getPacks();
			for(int i=0; i<productosSeleccionados.length;i++){
				for(PackVO p: packDisponibles){
					if(p.getProducto().equals(productosSeleccionados[i].getProducto())){
						packDisponibles.remove(p);
					}
				}
			}
			
		}
		if(event.getNewStep().equals("terminar")){
			cargarProductosSeleccionados();
			if(this.pack.getPackId() != null){
				this.comercializacionPack.setPack(this.pack);
			}
		}
        return event.getNewStep();        
    }  

	private void cargarProductosSeleccionados(){
		for(int i=0; i<productosSeleccionados.length;i++){			
				productoAsignados.add(productosSeleccionados[i].getProducto());	
			}	
	}

	public void listenerTipoCliente(TipoClienteVO pTipoCliente){
		this.tipoCliente = pTipoCliente;
		productosDisponibles = serviceSujeto.getProductosConDescuentoByTipoCliente(tipoCliente);
		for(DesProdTipoCliVO p: productosDisponibles){
			System.out.println(p.getProducto().getNombre());
		}
	}
	
	public void listenerReparto(RepartoVO pReparto){
		this.reparto = serviceReparto.getRepartoById(pReparto.getRepartoId());	
		System.out.println("reparto: "+ reparto.getNombre());
	}
	
	public void listenerComercializacionPack(PackVO pPack){
		ProductoServicio service = new ProductoServicioImp();
		this.pack = service.getPackById(pPack.getPackId());
	}
	
	public void btnGuardarSucursal(){
		if(guardarSujeto().equals(ConstantModel.SUCCESS)){
			if(guardarSucursal().equals(ConstantModel.SUCCESS)){
				if(guardarVisita().equals(ConstantModel.SUCCESS)){
					if(productosSeleccionados.length>0){
						guardarProductos();
					}
					if(pack.getPackId() != null){
						guardarComercializacionPack();
					}
				}
			}			
		}
	}
	
	private String guardarSujeto(){
		this.sujeto.setTipoSujeto(Constante.SUJETO_RESIDENCIAL);
		this.sujeto.setTipoCliente(tipoCliente);
		return serviceSujeto.insertSujetoVO(sujeto);
	}
	
	private String guardarSucursal(){		
		this.sucursal.setSujeto(this.sujeto);
		this.sucursal.setProvincia("CORDOBA");
		this.sucursal.setLocalidad("CORDOBA");
		this.sucursal.setNumeroSucursal(serviceSucursal.getUltimoNumeroSucursal(this.sujeto));
		return serviceSucursal.insertSucursal(sucursal);
	}
	
	private String guardarVisita(){
		visita.setSucursal(this.sucursal);			
		return serviceReparto.insertVisita2(visita, getDiasSeleccionados());
	}
	
	private String guardarProductos(){
		return serviceSucursal.assignProductosSucursal(sucursal, productosSeleccionados);
	}
	
	private String guardarComercializacionPack(){
		return serviceSucursal.insertComercializcionPackVO(this.comercializacionPack);
	}

	// --- GET AND SET ---
	public SucursalVO getSucursal(){
		return sucursal;
	}
    
    public SujetoVO getSujeto(){
    	return sujeto;
    }
    
    public VisitaVO getVisita(){
    	return visita;
    }
    
    public RepartoVO getReparto(){
    	return reparto;
    }
    
    public TipoClienteVO getTipoCliente(){
    	return tipoCliente;
    }

	public List<DesProdTipoCliVO> getProductosDisponibles() {
		return productosDisponibles;
	}
	
	public DesProdTipoCliVO[] getProductosSeleccionados() {
		return productosSeleccionados;
	}

	public void setProductosSeleccionados(DesProdTipoCliVO[] productosSeleccionados) {
		this.productosSeleccionados = productosSeleccionados;
	}

	public String[] getDiasSeleccionados() {
		return diasSeleccionados;
	}

	public void setDiasSeleccionados(String[] diasSeleccionados) {
		this.diasSeleccionados = diasSeleccionados;
	}
	
	public ComercializacionPackVO getComercializacionPack(){
		return comercializacionPack;
	}

	public List<ProductoVO> getProductoAsignados() {
		return productoAsignados;
	}
	
	public PackVO getPack(){
		return pack; 
	}

	public List<PackVO> getPackDisponibles() {
		return packDisponibles;
	}
	
	// -------------------
}
